﻿using JMI_Nucleo.Classe;
using JMI_Nucleo.Enumerador;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace JMI_Nucleo.View.Form_Util
{
    public partial class FrmConfigConexao : Form
    {
        string caminhoArquivo;
        DataSet dsXML = new DataSet();
        DataTable tbXML = new DataTable("ConfigBD");
        ConfigBD config = new ConfigBD();

        public FrmConfigConexao()
        {
            InitializeComponent();
            caminhoArquivo = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
            caminhoArquivo += "\\ConfigBD.xml";
        }

        private void DefineDataSet()
        {
            tbXML.Columns.Add("Servidor", typeof(string));
            tbXML.Columns.Add("Porta", typeof(int));
            tbXML.Columns.Add("Usuario", typeof(string));
            tbXML.Columns.Add("Senha", typeof(string));
            tbXML.Columns.Add("Base", typeof(string));
            tbXML.Columns.Add("Engine", typeof(Int16));
            tbXML.Columns.Add("Provedor", typeof(string));
            dsXML.Tables.Add(tbXML);
        }

        private void InicializaFormulario()
        {
            String[] arrEngine = Enum.GetNames(typeof(Engine));

            CboProvedor.Items.Clear();
            for (int i = 0; i < arrEngine.Length; i++)
            {
                CboProvedor.Items.Add(arrEngine[i]);
            }


            if (File.Exists(caminhoArquivo))
            {
                DefineDataSet();
                dsXML.ReadXml(caminhoArquivo);
                if (tbXML.Rows.Count > 0)
                {
                    DataRow linha = tbXML.Rows[0];
                    config.Servidor = linha["Servidor"].ToString();
                    config.Porta = int.Parse(linha["Porta"].ToString());
                    config.Usuario = linha["Usuario"].ToString();
                    config.Senha = linha["Senha"].ToString();
                    config.Base = linha["Base"].ToString();
                    config._Engine = (Engine)Convert.ToInt16(linha["Engine"]);
                    config.Provedor = linha["Provedor"].ToString();
                }
                TxtServidor.Text = config.Servidor;
                TxtPorta.Text = config.Porta.ToString();
                TxtUsuario.Text = config.Usuario;
                TxtSenha.Text = config.Senha;
                TxtBanco.Text = config.Base;
            }
            TxtServidor.Focus();
        }

        private void SalvaArquivo()
        {
            if (JMIMsg.MsgConfirma("Confirma gravação do arquivo ?") == System.Windows.Forms.DialogResult.Yes)
            {
                if (File.Exists(caminhoArquivo))
                    File.Delete(caminhoArquivo);
                DefineDataSet();
                // Adiciona linha ao DataSet
                DataRow dr = tbXML.NewRow();
                dr["Servidor"] = config.Servidor;
                dr["Porta"] = config.Porta.ToString();
                dr["Usuario"] = config.Usuario;
                dr["Senha"] = config.Senha;
                dr["Base"] = config.Base;
                dr["Engine"] = config._Engine;
                switch (config._Engine)
                {
                    case Engine.PostgreSQL: 
                        config.Provedor = "Npgsql"; 
                        break;
                    case Engine.SQLServer:
                        config.Provedor = "System.Data.SqlClient";
                        break;
                    case Engine.MySQL:
                        config.Provedor = "MySql.Data.MySqlClient";
                        break;
                }
                 dr["Provedor"] = config.Provedor;
                tbXML.Rows.Add(dr);
                dsXML.WriteXml(caminhoArquivo);
            }
        }

        private void BtnCancelar_Click(object sender, EventArgs e)
        {
            Application.Exit();
        }

        private void BtnOK_Click(object sender, EventArgs e)
        {
            if (TxtServidor.Text.Trim() == String.Empty)
            {
                JMIMsg.MsgInformacao("Nome ou IP do servidor não foi informado.");
                TxtServidor.Focus();
            }
            if (TxtPorta.Text.Trim() == String.Empty)
            {
                JMIMsg.MsgInformacao("Porta do servidor não foi informado.");
                TxtPorta.Focus();
            }
            if (TxtUsuario.Text.Trim() == String.Empty)
            {
                JMIMsg.MsgInformacao("Usuario padrão do banco de dados não foi informado.");
                TxtUsuario.Focus();
            }
            if (TxtSenha.Text.Trim() == String.Empty)
            {
                JMIMsg.MsgInformacao("Senha do usuário padrão do banco de dados não foi informado.");
                TxtSenha.Focus();
            }
            if (TxtBanco.Text.Trim() == String.Empty)
            {
                JMIMsg.MsgInformacao("Nome do banco de dados não foi informado.");
                TxtBanco.Focus();
            }
            if (CboProvedor.Text == String.Empty)
            {
                JMIMsg.MsgInformacao("Provedor do banco de dados não foi informado.");
                CboProvedor.Focus();
            }

            config.Servidor = TxtServidor.Text;
            config.Porta = int.Parse(TxtPorta.Text);
            config.Usuario = TxtUsuario.Text;
            config.Senha = TxtSenha.Text;
            config.Base = TxtBanco.Text;
            config.Provedor = CboProvedor.Text;
            if (CboProvedor.Text == Enum.GetName(typeof(Enumerador.Engine), 1))
                config._Engine = Engine.PostgreSQL;
            else if (CboProvedor.Text == Enum.GetName(typeof(Enumerador.Engine), 2))
                config._Engine = Engine.SQLServer;
            else if (CboProvedor.Text == Enum.GetName(typeof(Enumerador.Engine), 3))
                config._Engine = Engine.MySQL;
            SalvaArquivo();
            Close();
        }

        private void FrmConfigConexaoBD_Load(object sender, EventArgs e)
        {
            InicializaFormulario();
        }

        private void FrmConfigConexaoBD_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter)
                this.SelectNextControl(this.ActiveControl, !e.Shift, true, true, true);
        }
    }
}
